热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

框图|中将_DA14531学习笔记经验总结

篇首语:本文由编程笔记#小编为大家整理,主要介绍了DA14531 学习笔记经验总结相关的知识,希望对你有一定的参考价值。 DA14531 学习笔记(二)经验总结 烧录 Fl

篇首语:本文由编程笔记#小编为大家整理,主要介绍了DA14531 学习笔记经验总结相关的知识,希望对你有一定的参考价值。



DA14531 学习笔记(二)经验总结

烧录


Flash

DA14531 为了降低成本和功耗,片内有32KB的OTP用于存放用户程序。

OTP只能烧录一次,为了方便调试,DA14531还支持外部flash。

使用外部flash时,首先需要根据硬件配置flash对应管脚


然后连接烧录就可以了


OTP

正式生产的时候就需要将外部flash去掉,烧录OTP。OTP烧录分为两部分,OTP header 和 固件


OTP header


  • 禁用jtag管脚

  • 使用OTP



    两个标志位需要选择yes


  • 设置MAC地址



    使用public 地址时,可以设置这里


  • OTP 长度



    上电后,需要使用DMA将OTP中的代码搬运到RAM(OTP不能跑代码),实测这里不填实际长度也可以(使用默认FFFFFFFF)



SDK 框架

DA14531 SDK不建议修改程序结构,也就是不建议修改mian函数。程序的执行流程如下


根据SDK框架的程序执行流程,用户可以在回调函数中添加自己的代码,而不需要直接修改mian函数。
回调函数在user_callback_config.h 文件中


MAC地址


静态随机地址

选择使用静态随机地址

默认静态随机地址生成函数,可以修改成自己的。

也可以在广播开始前修改

#include "llm.h"
#include "lld_util.h"
/* 使用静态地址时, 可以修改这里修改地址 */
llm_le_env.rand_add.addr[0] = 0x00;
llm_le_env.rand_add.addr[1] = 0x01;
llm_le_env.rand_add.addr[2] = 0x02;
llm_le_env.rand_add.addr[3] = 0x03;
llm_le_env.rand_add.addr[4] = 0x04;
llm_le_env.rand_add.addr[5] = 0xC9;

广播开始后修改地址

#include "llm.h"
#include "lld_util.h"
llm_le_env.rand_add.addr[0] = 0x01;
...
lld_util_set_bd_address(&llm_le_env.rand_add, ADDR_RAND);

公共地址

设置公共地址

公共地址默认设置

当OTP header 中的地址字节不是 0xFFFFFFFFFFFF 时,CFG_NVDS_TAG_BD_ADDRESS 的默认地址将会无效,工程使用OTP Header 中的MAC地址

程序可以通过 nvds_get_func 函数来获取公共地址

#include "llm.h"
/* 获取广播地址 */
uint8_t addr[6];
nvds_get_func(NVDS_TAG_BD_ADDRESS, NULL, addr);

低功耗

DA14531的框图如下所示,突出显示的红色框是放置保留存储器块的位置,其中包括SysRAM1(16kB),SysRAM2(12kB)和SysRAM3(20kB)。因此,总共有48kB的系统RAM可用。

DA14531 有三种休眠模式:


  1. 扩展睡眠模式

    在扩展休眠模式下,除 SysRAM、无线电域和外设域外设域外,系统域将断电,XTAL16M 时钟将停止。SysRAM 仍通电以保留数据,但无法访问。

    AON电源域为ON,用于将数据保存在保留RAM中,并为可以唤醒系统的模块(即唤醒计时器,正交解码器和BLE计时器)供电。

  2. 深度睡眠模式

    在深度睡眠模式下,为了进一步降低功耗,SysRAM也断电。其他电源域的状态与在扩展休眠模式下的状态相同。

    该器件可以使用时钟唤醒控制器、GPIO、RTC 警报或定时器1从深度睡眠中唤醒。

  3. 休眠休眠模式

    与前两种睡眠模式相比,在休眠模式下,PD_SLP(睡眠电源域)域将关闭。这意味着CRG(时钟和复位发生器)已关闭电源,这就是为什么此模式称为无时钟模式的原因。

    设备只能从配置为唤醒的 GPIO 中唤醒。用于将设备从休眠状态唤醒的可用GPIO P0_1,P0_2…P0_5。

睡眠模式由 SDK 中的#defines配置


  • Extended Sleep mode



    扩展睡眠模式可以选择 ARCH_EXT_SLEEP_OTP_COPY_ON 模式(代码RAM休眠,休眠后功耗会更低(只保留数据RAM),但是退出休眠时需要从OTP中将代码搬运到RAM,这部分操作也会耗电,如果休眠周期小于1s,不建议使用 ARCH_EXT_SLEEP_OTP_COPY_ON 模式)和 ARCH_EXT_SLEEP_ON模式。休眠时SDK会自动计算出RAM Blank使用情况,将未使用的RAM关闭。

    扩展睡眠模式可以通过RTC,Timer1, BLE timer唤醒,例如如果有BLE事件(如定时广播等),则BLE Timer可以唤醒DA14531.




    如果没有BLE唤醒,也可以设置额外的定时唤醒周期。


  • Deep Sleep mode

  • Hibernation mode



    深度睡眠模式和 休眠休眠模式比较类似,可以选择性关闭RAM 或者保留全部RAM,当关闭所有RAM后,休眠时更省电,但是唤醒时需要重新将代码从OTP加载到RAM。使用的时候需要定义相对的宏定义并定义唤醒方式,具体可以参考SDK中\\projects\\target_apps\\ble_examples\\prox_reporter 或者 扩展SDK中的hibernation 例子


    /**
    ****************************************************************************************
    *
    * @file user_proxr.h
    *
    * @brief Proximity Project application header file.
    *
    * Copyright (C) 2015-2020 Dialog Semiconductor.
    * This computer program includes Confidential, Proprietary Information
    * of Dialog Semiconductor. All Rights Reserved.
    *
    ****************************************************************************************
    */

    #ifndef _USER_PROXR_H_
    #define _USER_PROXR_H_
    /**
    ****************************************************************************************
    * @addtogroup APP
    * @ingroup RICOW
    *
    * @brief User Application entry point.
    *
    * @
    ****************************************************************************************
    */

    /*
    * INCLUDE FILES
    ****************************************************************************************
    */

    #include
    #include "gapc_task.h"
    /*
    * DEFINES
    ****************************************************************************************
    */

    /****************************************************************************************
    * Selects the sleep mode that the device will enter after advertising completion *
    * - CFG_APP_GOTO_DEEP_SLEEP Deep Sleep mode *
    * - CFG_APP_GOTO_HIBERNATION Hibernation mode (DA14531 only) *
    * - CFG_APP_GOTO_STATEFUL_HIBERNATION Stateful Hibernation mode (DA14531 only) *
    * Note: If none is defined, then system will enter the selected Extended sleep mode *
    * *
    * IMPORTANT: If CFG_APP_GOTO_STATEFUL_HIBERNATION is defined, CFG_STATEFUL_HIBERNATION *
    * shall be defined as well (in Options for Target 'DA14531' --> Asm --> *
    * Conditional Assembly Control Symbols --> Define:) *
    ****************************************************************************************/

    #undef CFG_APP_GOTO_DEEP_SLEEP
    #if defined (__DA14531__)
    #undef CFG_APP_GOTO_HIBERNATION
    #undef CFG_APP_GOTO_STATEFUL_HIBERNATION
    #if defined (CFG_APP_GOTO_HIBERNATION)
    /****************************************************************************************
    * Hibernation mode configuration *
    ****************************************************************************************/

    #define CFG_HIBERNATION_RAM1 PD_SYS_DOWN_RAM_OFF
    #define CFG_HIBERNATION_RAM2 PD_SYS_DOWN_RAM_OFF
    #define CFG_HIBERNATION_RAM3 PD_SYS_DOWN_RAM_OFF
    #define CFG_HIBERNATION_REMAP REMAP_ADDR0_TO_ROM
    #define CFG_HIBERNATION_PAD_LATCH_EN false
    #elif defined (CFG_APP_GOTO_STATEFUL_HIBERNATION)
    /****************************************************************************************
    * Stateful Hibernation mode configuration *
    ****************************************************************************************/

    #define CFG_STATEFUL_HIBERNATION_RAM1 PD_SYS_DOWN_RAM_ON
    #define CFG_STATEFUL_HIBERNATION_RAM2 PD_SYS_DOWN_RAM_ON
    #define CFG_STATEFUL_HIBERNATION_RAM3 PD_SYS_DOWN_RAM_ON
    #define CFG_STATEFUL_HIBERNATION_REMAP STATEFUL_HIBERN_REMAP_ADDR0_TO_RAM1
    #define CFG_STATEFUL_HIBERNATION_PAD_LATCH_EN false
    #endif // CFG_APP_GOTO_HIBERNATION
    #endif // __DA14531__
    #if defined (CFG_APP_GOTO_DEEP_SLEEP) && (defined (CFG_APP_GOTO_HIBERNATION) || defined (CFG_APP_GOTO_STATEFUL_HIBERNATION))
    #error "Config error: Can not define both CFG_APP_GOTO_DEEP_SLEEP and CFG_APP_GOTO_HIBERNATION/CFG_APP_GOTO_STATEFUL_HIBERNATION."
    #endif
    #if defined (CFG_SPI_FLASH_ENABLE) && (defined (CFG_APP_GOTO_HIBERNATION) || defined (CFG_APP_GOTO_STATEFUL_HIBERNATION))
    #error "Config error: Can not define both CFG_SPI_FLASH_ENABLE and CFG_APP_GOTO_HIBERNATION/CFG_APP_GOTO_STATEFUL_HIBERNATION."
    #endif
    #if defined (CFG_APP_GOTO_DEEP_SLEEP)
    /****************************************************************************************
    * Deep Sleep mode and Wake-up from Deep Sleep Configuration *
    * Selects the trigger mechanism to wake up from deep sleep. *
    * *
    * - CFG_DEEP_SLEEP_WAKEUP_POR - Wake up from POR pin *
    * *
    * - CFG_DEEP_SLEEP_WAKEUP_GPIO - Wake up from WakeUp Controller *
    * *
    * - CFG_DEEP_SLEEP_WAKEUP_RTC - Wake up from RTC Timer (only in DA14531) *
    * *
    * - CFG_DEEP_SLEEP_WAKEUP_TIMER1 - Wake up from Timer1 (only in DA14531) *
    * *
    * NOTE: *
    * A hardware reset or power cycle will always wake up the system from deep sleep. *
    ****************************************************************************************/

    #undef CFG_DEEP_SLEEP_WAKEUP_POR
    #define CFG_DEEP_SLEEP_WAKEUP_GPIO
    /****************************************************************************************
    * Deep sleep mode configuration *
    ****************************************************************************************/

    #define CFG_DEEP_SLEEP_RAM1 PD_SYS_DOWN_RAM_OFF
    #define CFG_DEEP_SLEEP_RAM2 PD_SYS_DOWN_RAM_OFF
    #define CFG_DEEP_SLEEP_RAM3 PD_SYS_DOWN_RAM_OFF
    #define CFG_DEEP_SLEEP_PAD_LATCH_EN false
    #if defined (__DA14531__)
    #undef CFG_DEEP_SLEEP_WAKEUP_RTC
    #undef CFG_DEEP_SLEEP_WAKEUP_TIMER1
    #endif
    #if defined (CFG_DEEP_SLEEP_WAKEUP_POR) && defined (CFG_DEEP_SLEEP_WAKEUP_GPIO)
    #error "Config error: Can not define both CFG_DEEP_SLEEP_WAKEUP_POR and CFG_DEEP_SLEEP_WAKEUP_GPIO."
    #endif
    #if !defined (CFG_DEEP_SLEEP_WAKEUP_POR) && !defined (CFG_DEEP_SLEEP_WAKEUP_GPIO) && \\
    !defined (CFG_DEEP_SLEEP_WAKEUP_RTC) && !defined (CFG_DEEP_SLEEP_WAKEUP_TIMER1)

    #error "Config error: At least one wake-up source has to be selected."
    #endif
    #endif
    /****************************************************************************************
    * Wake-up from Extended Sleep Configuration *
    * Selects the trigger mechanism to wake up from extended sleep. *
    * *
    * - CFG_EXT_SLEEP_WAKEUP_RTC - Wake up from RTC Timer (only in DA14531) *
    * *
    * - CFG_EXT_SLEEP_WAKEUP_TIMER1 - Wake up from Timer1 (only in DA14531) *
    * *
    * NOTE: *
    * If none is defined, then system will wake up from extended sleep by button press. *
    ****************************************************************************************/

    #undef CFG_EXT_SLEEP_WAKEUP_RTC
    #undef CFG_EXT_SLEEP_WAKEUP_TIMER1
    #if defined (CFG_EXT_SLEEP_WAKEUP_RTC) && defined (CFG_EXT_SLEEP_WAKEUP_TIMER1)
    #error "Config error: Can not define both CFG_EXT_SLEEP_WAKEUP_RTC and CFG_EXT_SLEEP_WAKEUP_TIMER1."
    #endif
    /*
    * FUNCTION DECLARATIONS
    ****************************************************************************************
    */

    /**
    ****************************************************************************************
    * @brief Enable push button. Register callback function for button press event.
    * Must be called in periph_init().
    ****************************************************************************************
    */

    void app_button_enable(void);
    /**
    ****************************************************************************************
    * @brief Function to be called on the advertising completion event.
    * @param[in] status GAP Error code
    ****************************************************************************************
    */

    void app_advertise_complete(const uint8_t status);
    #if (BLE_SUOTA_RECEIVER)
    /**
    ****************************************************************************************
    * @brief Function called when the SUOTAR status changes.
    * @param[in] suotar_event SUOTAR_START or SUOTAR_STOP
    ****************************************************************************************
    */

    void on_suotar_status_change(const uint8_t suotar_event);
    #endif // BLE_SUOTA_RECEIVER
    /**
    ****************************************************************************************
    * @brief Disconnection function.
    * @param[in] param Pointer to GAPC_DISCONNECT_IND message
    ****************************************************************************************
    */

    void user_app_on_disconnect(struct gapc_disconnect_ind const *param);
    /// @ APP
    #endif // _USER_PROXR_H_


ADC


ADC内部有一个分压电路,使用的时候需要注意。



学习笔记,如有错误,欢迎斧正。



推荐阅读
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • Shiro功能拓展:登录失败重试次数限制
    本文详细介绍了如何在Apache Shiro框架中实现对用户登录失败重试次数的限制,通过自定义密码匹配器来增强系统的安全性。该方法不仅能够有效防止暴力破解攻击,还能确保合法用户的账户安全。 ... [详细]
  • Linux双网卡绑定技术详解与实践
    本文详细介绍了如何在Linux系统中实现双网卡绑定,即将两块物理网卡合并为一个逻辑网卡,以提高网络性能和可靠性。文中不仅涵盖了基本的概念,还提供了具体的配置步骤和测试方法。 ... [详细]
  • 统计报表模板及其实现方法
    本文介绍两个实用的统计报表模板,并提供如何将这些静态模板转换为动态JSP页面的方法。同时,文中附上了详细的代码示例。 ... [详细]
  • Python3兼容性提升:Robot Framework与RIDE的最新进展
    本文介绍了Robot Framework,一个基于Python的自动化测试框架,以及其配套IDE RIDE的最新更新。随着Python3的广泛采用,RIDE终于实现了对Python3的支持,这为Robot Framework的用户带来了福音。 ... [详细]
  • 本文介绍了一个使用Keras框架构建的卷积神经网络(CNN)实例,主要利用了Keras提供的MNIST数据集以及相关的层,如Dense、Dropout、Activation等,构建了一个具有两层卷积和两层全连接层的CNN模型。 ... [详细]
  • 本文介绍了如何在 Linux 系统上构建网络路由器,特别关注于使用 Zebra 软件实现动态路由功能。通过具体的案例,展示了如何配置 RIP 和 OSPF 协议,以及如何利用多路由器查看工具(MRLG)监控网络状态。 ... [详细]
  • 本文详细介绍了如何通过 `vue.config.js` 文件配置 Vue CLI 的打包和代理设置,包括开发服务器配置、跨域处理以及生产环境下的代码压缩和资源压缩。 ... [详细]
  • Flutter入门指南:实现自动关闭的对话框与提示
    本文为Flutter系列教程的一部分,专注于讲解如何在Flutter应用中实现自动关闭的对话框和提示。通过具体的代码示例,帮助开发者掌握SnackBar、BottomSheet和Dialog的使用方法。 ... [详细]
  • grep、sed、awk一、grep的用法1、grep简介grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep包 ... [详细]
  • UnityNGUIScrollView苹果式滑动
    又回来写博客了,这回已经开始上班了,所以就发一发工作中解决的难题吧。单个展示Panel(苹果式)以前对UI的滑动组件很烦心,不是很会用,这回项目要求写一个类似于苹果的文件滑动效果, ... [详细]
  • 实现‘点击恢复’功能 - Tap-to-Resume Feature in SpriteKit
    了解如何在应用程序从非活动状态返回时,在SpriteKit游戏中添加一个‘点击恢复’的文字提示。 ... [详细]
  • 导读上一篇讲了zsh的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf的使用等等。其中很多内容没有必要记忆,作为手册参 ... [详细]
  • Flutter 高德地图插件使用指南
    本文档详细介绍了如何在Flutter项目中集成和使用高德地图插件,包括安装、配置及基本使用方法。 ... [详细]
  • 深入理解Play Framework 1.2.7中的缓存机制
    本文探讨了Play Framework 1.2.7版本中提供的缓存解决方案,包括Ehcache和Memcached的集成与使用。文章详细介绍了缓存相关的类及其功能,以及如何通过配置选择合适的缓存实现。 ... [详细]
author-avatar
刘家大宝688
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有